﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using IndignadoFramework.BackBone.InternalServices;
using IndignadoFramework.BackBone.InternalServices.Implementacion;
using IndignadoFramework.BackBone.Model;
using IndignadoFramework.BackBone.DTO;
using IndignadoFramework.FrontOffice.Models;

namespace IndignadoFramework.FrontOffice.Controllers
{
    public class ChatController : SiteController
    {
        private ChatServices _chatI;
        private UsuarioServices _usuarioI;
        
        public ChatController()
            : this(new ChatServicesImpl())
        {
            _usuarioI = new UsuarioServicesImpl();
        }

        public ChatController(ChatServices chat)
        {
            _chatI = chat;
        }

        [HttpPost]
        [Authorize]
        public ActionResult VentanaChatJson()
        {
            ChatModel model = new ChatModel();
            // Obtengo los usuarios conectados
            model.UsuariosConectados = _chatI.getUsuariosConectados(Site.Id, Int32.Parse(User.Identity.Name));
            model.SesionChatAbiertas = _chatI.getSesionChatAbiertas(Site.Id, Int32.Parse(User.Identity.Name));
            model.SesionChatPendientes = _chatI.getSesionChatPendientes(Site.Id, Int32.Parse(User.Identity.Name));
            if (Site != null)
            {
                ViewBag.MovimientoId = Site.Id;
                ViewBag.MovimientoNombre = Site.MovimientoNombre;
                ViewBag.MovimientoDescripcion = Site.MovimientoDescripcion;
            }
            ViewBag.UsuariosConectados = model.UsuariosConectados.Count();
            ViewBag.UsuariosConectados += model.SesionChatAbiertas.Count();
            ViewBag.UsuariosConectados += model.SesionChatPendientes.Count();

            return Json(new
            {
                model = model
            });
        }

        [Authorize]
        public ActionResult VentanaChat()
        {
            return View();
        }

        [Authorize]
        public ActionResult IniciarSesion()
        {
            // Logueo al usuario en el sistema
            _usuarioI.loginUsuario(Int32.Parse(User.Identity.Name), Site.Id);
            return Json(new { }, JsonRequestBehavior.AllowGet);
        }

        [HttpPost]
        [Authorize]
        public ActionResult IniciarChat(int usuarioReceptorId)
        {
            int chatId = _chatI.initSesionChat(Site.Id, Int32.Parse(User.Identity.Name), usuarioReceptorId);
            return Json(new { status = chatId != -1, chatId = chatId }, JsonRequestBehavior.AllowGet);
        }

        [HttpPost]
        [Authorize]
        public ActionResult CerrarChat(int id)
        {
            if (_chatI.closeSesionChat(Site.Id, id))
                return Json("ok");
            else
                return Json("failed");
        }

        [HttpPost]
        [Authorize]
        public ActionResult AgregarMensaje(int chatSessionId, string msjTexto)
        {
            MensajeModel m = new MensajeModel();
            m.SesionChatId = chatSessionId;
            m.MovimientoId = Site.Id;
            m.MensajeTexto = msjTexto;
            m.MensajeFechaEnvio = DateTime.Now;
            m.MensajeEmisorNombre = _usuarioI.getNombreUsuario(Int32.Parse(User.Identity.Name), Site.Id);
            _chatI.addMensajeChat(m);
            return Json("ok");
        }

        [HttpPost]
        [Authorize]
        public ActionResult GetMensajes(int chatSessionId, int ultMsjId)
        {
            var msgs = _chatI.getMensajes(Site.Id, chatSessionId, ultMsjId);

            return Json(new
            {
                lastId = msgs.Count() > 0 ? msgs.Max(x => x.Id) : 0,
                msgs = msgs
            });
        }

        [Authorize]
        public ActionResult SesionChat(int UsuarioId)
        {
            int chatId = _chatI.initSesionChat(Site.Id, Int32.Parse(User.Identity.Name), UsuarioId);
            ViewBag.Usuario = _usuarioI.getNombreUsuario(UsuarioId, Site.Id);
            return View(chatId);
        }

        [Authorize]
        public ActionResult CerrarSesion()
        {
            // Deslogueo al usuario del sistema
            _usuarioI.logoutUsuario(Int32.Parse(User.Identity.Name), Site.Id);
            return Json(new { }, JsonRequestBehavior.AllowGet);
        }
    }
}
